package com.deke.utils;

import cn.hutool.core.codec.Base64;
import cn.hutool.crypto.SecureUtil;
import cn.hutool.crypto.symmetric.SymmetricAlgorithm;
import cn.hutool.crypto.symmetric.SymmetricCrypto;

import java.util.HashMap;
import java.util.Map;
import java.util.Random;

/**
 * @author ：Username 刘亦辰（59372312@qq.com）
 * @date ：Created in 2022/12/17 11:05
 * @description：
 * @modified By：
 * @version:
 **/
public class RandomCode {

    private String code;

    public static String YanZhengMa(Integer num){
        String str = "0123456789";
        Random random = new Random();
        StringBuffer sb = new StringBuffer();
        for (int  i = 0 ; i < num ;i++){
            int number = random.nextInt(10);
            sb.append(str.charAt(number));
        }
        String code = sb.toString();
        return code;
    }
    
    /**
     * @create by: Username 刘亦辰 
     * @description:  密码加盐加密
     * @create time: 2022/12/17 16:21
     * @param null 
     * @return :  
     **/
    public static Map<String, String> makePasswordSalt(String password) {
        Map<String, String> map = new HashMap<>();
        //随机生成密钥(盐值)
        byte[] key = SecureUtil.generateKey(SymmetricAlgorithm.AES.getValue()).getEncoded();
        //将盐值转换格式（方便数据库保存）,byte数组转字符串
        String salt = Base64.encode(key);
        //构建加密对象
        SymmetricCrypto aes = null;
        //Base64.decode(salt)，将字符串转换成byte数组
        aes = new SymmetricCrypto(SymmetricAlgorithm.AES, Base64.decode(salt));
        //加密为16进制表示
        String encryptHex = aes.encryptHex(password);
        //加密之后的密文
        map.put("password", encryptHex);
        //盐值，保存盐值的作用是为了登录
        map.put("salt", salt);
        return map;
    }

    /**
     * @return string 密文
     * @param1 password  明文密码
     * @param2 salt  盐值
     * @create by: ludi（206913808@qq.com）
     * @description: 密码加盐加密(登录的时候 ， Username唯一 ， 根据用户名查询到数据库的密文和盐值 ， 明文密码)
     * @create time: 2022/8/29 15:31
     */
    public static String makePasswordSalt(String password, String salt) {
        //构建
        SymmetricCrypto aes = null;
        aes = new SymmetricCrypto(SymmetricAlgorithm.AES, Base64.decode(salt));
        //加密为16进制表示
        String encryptHex = aes.encryptHex(password);
        return encryptHex;
    }
}